package dp;
import md.ContrasenaMD;
import java.sql.*;

import java.io.*;
import java.util.Date;
import java.util.regex.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.ArrayList;
import java.util.List;

/***********************************************************************
 * Module:  Contrasena.java
 * Author:  Enrico
 * Purpose: Defines the Class Contrasena
 ***********************************************************************/


public class ContrasenaDP {
   private String contrasena;
   private String fechaIngreso;
   private int idContrasena;
   private int codigoCategoria;
   private ContrasenaMD contrasenaMd;

    /**
    * Constructor vacio. Por defecto
    */
   public ContrasenaDP() {
        this.contrasena = "";
        this.fechaIngreso = "";
        this.idContrasena = -1;
        this.codigoCategoria = -1;
        this.contrasenaMd=new ContrasenaMD();
    }

   /** 
    * Metodo para ingresar una nueva contrasena en el sistema.
    * 
    * @return  Devuelve true si es que se ingresa correctamente el registro
    * en la base.
    */
   public boolean ingresarContrasena() {
      boolean retorno = false;
      System.out.println("EntreDPingresar");
      this.fechaIngreso=obtenerFechaIngreso();

      if(verificarContrasena())
      {
          retorno=true;
          System.out.println("Entre1DPingresar");
          this.idContrasena=this.contrasenaMd.ingresarContrasena(this.contrasena, this.fechaIngreso, this.codigoCategoria);
          System.out.println(this.fechaIngreso);
          System.out.println(this.idContrasena);
      }
      return retorno;
   }
   
   /**
    * Metodo para modificar una contrasena en el sistema.
    *
    * @return  Devuelve true si es que se modifica correctamente el registro
    * en la base.
    */
   public boolean modificarContrasena() {
      boolean retorno = false;
      this.fechaIngreso=obtenerFechaIngreso();
      System.out.println("EntreDPmodificar");
      if(verificarContrasena())
      {
          System.out.println("Entre1DPmodificar");
          retorno=this.contrasenaMd.modificarContrasena(this.contrasena,this.fechaIngreso,this.idContrasena);
      }
      return retorno;
   }
   
   /**
     * Metodo para eliminar una contraseña que existe en el sistema.
     *
     * @return Devuelve TRUE si es que se ingresa correctamente el registro en
     * la BDD.
     */

   public boolean eliminarContrasena() {
      boolean retorno = false;
      System.out.println("El id a eliminar es :"+this.idContrasena);
      retorno=this.contrasenaMd.eliminarContrasena(this.idContrasena);
      return retorno;
   }

   
   /** 
    * Verifica el grado de seguridad de la cuenta de acuerdo a su categoria
    * 
    * @return Devuelve true si la contraseña ingresada cumple con los
    * requerimientos de seguridad para la categoria que se ingreso.
    */
    public boolean verificarContrasena() {
        boolean retorno = true;
        String expresionMinusculas = "[a-z]+";
        String expresionMayusculas = "[A-Z]+";
        String expresionNumeros = "[\\d]+";
        String expresionCaracteres = "[\\W]+";
        if (contrasena.length() > 0 && codigoCategoria > 0) {
            if(this.contrasenaMd.esFacil(this.contrasena))
            {
                 System.out.print("No facil");
            switch (this.codigoCategoria) {
                case 1:
                    if (this.contrasena.length() > 5) {
                        retorno=true;
                        System.out.print("Longitud");
                    } else {
                        System.out.println("Necesita una contraseña con una longitud de 6 caracteres");
                        retorno = false;
                    }
                    break;

                case 2:
                    Pattern patronMinusculasM = Pattern.compile(expresionMinusculas);
                    Matcher matcherMinM = patronMinusculasM.matcher(this.contrasena);

                    if ((matcherMinM.find() == true)) {
                        Pattern patronMayusculas = Pattern.compile(expresionMayusculas);
                        Matcher matcherMay = patronMayusculas.matcher(this.contrasena);

                        if (matcherMay.find() == true) {
                            if(this.contrasena.length() > 7) {

                                    } else {
                                        System.out.println("Necesita una contraseña con una longitud de 8 caracteres");
                                        retorno = false;
                                    }
                                } else {
                                    System.out.println("No tiene mayusculas");
                                    retorno = false;
                                }
                            } else {
                                System.out.println("No tiene minusculas");
                                retorno = false;
                            }
                        break;

                case 3:
                    Pattern patronMinusculas = Pattern.compile(expresionMinusculas);
                    Matcher matcherMin = patronMinusculas.matcher(this.contrasena);

                    if ((matcherMin.find() == true)) {
                        Pattern patronMayusculas = Pattern.compile(expresionMayusculas);
                        Matcher matcherMay = patronMayusculas.matcher(this.contrasena);

                        if (matcherMay.find() == true) {
                            Pattern patronNumeros = Pattern.compile(expresionNumeros);
                            Matcher matcherNum = patronNumeros.matcher(this.contrasena);

                            if (matcherNum.find() == true) {
                                Pattern patronCaracteres = Pattern.compile(expresionCaracteres);
                                Matcher matcherCar = patronCaracteres.matcher(this.contrasena);

                                if (matcherCar.find() == true) {
                                    if (this.contrasena.length() > 9) {

                                    } else {
                                        System.out.println("Necesita una contraseña con una longitud de 10 caracteres");
                                        retorno = false;
                                    }
                                } else {
                                    System.out.println("No tiene caracteres");
                                    retorno = false;
                                }
                            } else {
                                System.out.println("No tiene numeros");
                                retorno = false;
                            }
                        } else {
                            System.out.println("No tiene mayusculas");
                            retorno = false;
                        }
                    } else {
                        System.out.println("No tiene minusculas");
                        retorno = false;
                    }
                    break;
            }
        }else{
            System.out.println("Es una palabra muy comun");
            retorno=false;
        }
        }

        return retorno;
    }

   
     /***************************************
     * Getters & Setters
     ***************************************/

        /**
     * Muestra las TODAS cuentas disponible del usuario.
     * @return Duevuelve una lista con TODAS las cuentas disponibles par el
     * usuario
     */
    public List getListContrasenas() {
        return this.contrasenaMd.verContrasena();
    }

    public String IdPorPalabra(){
        String palabra="";
        palabra=this.contrasenaMd.idPorPalabra(this.idContrasena);
        //System.out.println(palabra);
        return palabra;
    }

   public String getContrasena() {
      return contrasena;
   }

    public void setContrasena(String contrasena) {
        this.contrasena = contrasena;
    }

    public void setCodigoCategoria(int codigoCategoria) {
        this.codigoCategoria = codigoCategoria;
    }
    
    public void setFechaIngreso(String fechaIngreso) {
        this.fechaIngreso = fechaIngreso;
    }

    public String obtenerFechaIngreso() {
        String fecha="";
        SimpleDateFormat formateador = new SimpleDateFormat("dd'/'MMMM'/'yyyy");
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone(TimeZone.getDefault());
        System.out.print(formateador.format(new Date()));
        return formateador.format(new Date());
    }

    public void setIdContrasena(int idContrasena) {
        this.idContrasena = idContrasena;
    }

   /** 
    * Setea los datos de la clase contraseña
    * @param contraseña, fecha, id, codigo
    */
   public void setDatos(String contrasena, int codigo) {
        this.contrasena = contrasena;
        this.fechaIngreso = obtenerFechaIngreso();
        this.idContrasena = contrasenaMd.getidSiguiente();
        this.codigoCategoria = codigo;
   }

   public int getidMax() {
        System.out.println("El id de la contrasena es :"+contrasenaMd.getidMax());
        return contrasenaMd.getidMax();
    }

   public int getidSiguiente() {
        return contrasenaMd.getidSiguiente();
    }

    public int getCodigoCategoria() {
        return codigoCategoria;
    }

    public ContrasenaMD getContrasenaMd() {
        return contrasenaMd;
    }

    public String getFechaIngreso() {
        return fechaIngreso;
    }

    public int getIdContrasena() {
        return idContrasena;
    }

}